package org.ccay.manage.security.service;

import java.util.Map;

import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;

import org.ccay.core.base.PageVO;
import org.ccay.core.base.PagedResult;
import org.ccay.security.annotation.SecurityBindingURL;
import org.ccay.security.annotation.SecurityOperation;
import org.ccay.security.annotation.SecurityResource;
import org.ccay.security.entity.User;
import org.ccay.security.vo.UserVO;

@Path("/userManage")
@Produces("application/json")
@SecurityResource(code="userManagement",name="系统管理|用户及权限管理|用户管理",desc="管理用户及用户权限")
public interface IUserManageService {
	
	@SecurityOperation(code="page",name="页面权限")
	@SecurityBindingURL("/security/user/userList.html")
	String userManagement = "USER_MANAGEMENT";
	
	
    /**
     * 添加用户
     * 首先调用{@link #validate4SaveOrUpdate(User)} 进行校验，再通过{@link #encrypt(UserVO)}对密码进行加密，然后存储到数据库中
     * @param user
     * @return key 错误类型 value 错误信息  成功返回空
     */
	@POST
	@Path("/create")
	@SecurityOperation(code="create",name="创建用户")
	Map<String,String> createUser(UserVO user);
	
	/**
	 * 保存用户前进行校验
	 * 若userId 不为空，则使用更新逻辑，否则使用新增逻辑进行校验
	 * @param user 
	 * @return key 错误类型 value 错误信息
	 */
	Map<String,String> validate4SaveOrUpdate(UserVO user);
	
    /**
     * 修改用户
     * 首先调用{@link #validate4SaveOrUpdate(User)} 进行校验 然后存储到数据库中
     * @param user
     * @return key 错误类型 value 错误信息 成功返回空
     */
	@POST
	@Path("/update")
	@SecurityOperation(code="update",name="修改用户")
	Map<String,String> updateUser(UserVO user);
    /**
     * 删除用户 
     * 执行逻辑删除 设置isdeleted = 1
     * @param ids
     * @return
     */
	@DELETE
	@Path("/delete/{userId}")
	@SecurityOperation(code="delete",name="删除用户")
    int deleteUser(@PathParam("userId")Long id);
    
    /**
     * 回复删除用户
     * @param ids
     * @return
     */
	@PUT
	@Path("/revert/{userId}")
	@SecurityOperation(code="revert",name="恢复已删除用户")
    int revertUser(@PathParam("userId") Long id);
    
    /**
     * 检查用户名是否唯一
     * @param username
     * @param userId
     * @return
     */
	@GET
	@Path("/checkUsernameUnique")
    boolean checkUsernameUnique(@QueryParam("userName")String userName,@QueryParam("userId")Long userId);
    /**
     * 检查用户名显示名是否唯一
     * @param username
     * @param userId
     * @return
     */
	@GET
	@Path("/checkUserDisplayNameUnique")
    boolean checkUserDisplayNameUnique(@QueryParam("userName")String userName,@QueryParam("userId")Long userId);
    
    
    /**
	 * 通过用户id获取用户对象但不包括用户所含有的角色列表
	 * @param id
	 * @return
	 */
	@GET
	@Path("/findUserById/{userId}")
	UserVO findUserById(@PathParam("userId") Long userId);
	
	/**
	 * 通过userName获取用户对象但不包括用户所含有的角色列表
	 * @param userName
	 * @return
	 */
	@GET
	@Path("/findUserByName/{userName}")
	UserVO findUserByName(@PathParam("userName")String userName);
	
	/**
	 * 用户分页查询-获取所有用户不区分是否有效及是否删除
	 * @param user 
	 * @param page
	 * @return
	 */
	@POST
	@Path("/findPagedUsers/{pageSize}/{curPage}")
	@SecurityOperation(code="query",name="查询用户",desc="可通过页面条件查询当前系统中的用户列表")
	@SecurityBindingURL("/security/user/userList.html")
	PagedResult<UserVO> findPagedUsers(UserVO user,@PathParam("")PageVO page);
	
	/**
	 * 用户分页查询-只返回有效用户
	 * 有效用户是指 1、未删除 2、状态为有效 3、当前系统时间小于过期时间
	 * @param user
	 * @param page
	 * @return
	 */
	@POST
	@Path("/findPagedEnabledUsers/{pageSize}/{curPage}")
	@SecurityOperation(code="query",name="查询用户",desc="可通过页面条件查询当前系统中的用户列表")
	PagedResult<UserVO> findPagedEnabledUsers(UserVO user,@PathParam("")PageVO page);
}
